#include <stdio.h>
#include <string.h>
#define N 510
#define debug false
int n;
int tu[N][N];
int flag[N];

int m,k;   //左边n个点,右边m个点

int map[N][N]; //存二部图的二维数组,有边则为1
int ans;			//存最大匹配方案数(也就是最小覆盖的点数)
int cx[N],cy[N],sx[N],sy[N];
//cx,cy:左右两边是否分配过.
//sx,sy:左右两边是否调整过.
int path(int u)
{
	int v;

	sx[u]=1;
	for (v=1;v<=m;v++)
		if (map[u][v]==1 && !sy[v]) //寻找一个相连的,且没有被调整过的点(注:可以是分配过的)
		{
			sy[v]=1;
			if ( !cy[v] || path(cy[v])) //如果右边的点没有分配过,或者分配了但是可以调整到其它边
			{
				cx[u]=v;
				cy[v]=u;
				return 1;
			}
		}
	return 0;
}


void solve()
{
	int i;
	memset(cx,0,sizeof(cx));
	memset(cy,0,sizeof(cy));
	ans=0;
	for (i=1;i<=n;i++)
		if (!cx[i])  //如果当前点没有分配与它对应的点，即开始试着分配。
		{
			memset(sx,0,sizeof(sx));
			memset(sy,0,sizeof(sy));
			ans+=path(i);     
		}
}

void mark(int a, int v)
{
    int i;
    flag[a] = v;
    v = -v;
    for (i=1; i<=tu[a][0]; ++i)
        if (flag[tu[a][i]]==0)
            mark(tu[a][i], v);
    
}    

void deal()
{
    int i, j;

    memset(flag, 0, sizeof(int)*n);
    memset(map, 0, sizeof(map));

    for (i=0; i<n; ++i)
    {
        if (flag[i]==0)
            mark(i, 1);
    }    
    for (i=0; i<n; ++i)
    {
        if (flag[i]==1)
                for (j=1; j<=tu[i][0]; ++j)
                   map[i+1][ tu[i][j]+1 ] = 1;
        if (flag[i]==-1)
                for (j=1; j<=tu[i][0]; ++j)
                   map[tu[i][j]+1 ][i+1] = 1;               
    }    
    if (debug)
    {
       for (i=1; i<=n; ++i,printf("\n")  )
           for (j=1; j<=n; ++j)
               printf("%d ", map[i][j]); 
    }    
}    

bool in()
{
    int i, j, k, l;
    if (scanf("%d", &n)==EOF) return false;
    for (i=0; i<n; ++i)
    {
        scanf("%d: (%d)", &j, &k);
        tu[j][0] = k;
        for (l=1; l<=k; ++l)
                scanf("%d", &tu[j][l]);
    }    
    return true;
}    
void output()
{
    printf("%d\n", n-ans);
   //printf("ans = %d\n", ans);
}    
int main()
{
    //freopen("d.dat", "r", stdin);
    //freopen("1466.out", "w", stdout);
    while (in())
    {
        deal();
        m = n;
        solve();
        output();
    }        
    return 0;    
}    

